/**
 * getAdminList   获取管理员列表
 * queryAdminList 查询管理员
 * addAdmin       添加管理员
 * getInfoAdmin   获取管理员信息
 * updateAdmin    修改管理员信息
 * lockAdmin      锁定管理员账号
 * deleteAdmin    删除管理员
 */
// 导入密码加密
bcrypt = require("bcryptjs")
const adminStatement = require("../../common/sql_sentences/administrator")

exports.getAdminList = async (req, res) => {
  try {
    const { state, permission, page, pagesize } = req.query
    // 获取管理员总数
    let total,
      sqlStr = adminStatement.selectCount({ state, permission })
    let results = await RunSQL(sqlStr)
    total = results[0].total

    // 获取管理员列表
    sqlStr = adminStatement.selectLimit({ state, permission }, page, pagesize)
    results = await RunSQL(sqlStr)
    return res.successSend("", 10000, { row: results, total })
  } catch (error) {
    res.errSend(error)
  }
}

exports.screenAdminList = async (req, res) => {
  try {
    // 获取管理员列表
    sqlStr = `select job_number, name from administrator`
    results = await RunSQL(sqlStr)
    return res.successSend("", 10000, results)
  } catch (error) {
    res.errSend(error)
  }
}

exports.queryAdminList = async (req, res) => {
  try {
    // 查找管理员
    const sqlStr = adminStatement.select(req.query)
    let results = await RunSQL(sqlStr)
    if (results.length < 1) return res.successSend("没有找到管理员！", 10005)
    return res.successSend("查找成功！", 10000, results[0])
  } catch (error) {
    res.errSend(error)
  }
}

exports.addAdmin = async (req, res) => {
  const data = req.body
  try {
    // 判断工号是否存在
    let sqlStr = adminStatement.selectCount({ job_number: data.job_number })
    let results = await RunSQL(sqlStr)
    if (results[0].total) return res.errSend("工号已存在！", 10005)

    // 判断手机号是否存在
    if (data.phone) {
      sqlStr = adminStatement.selectPhone(data.phone)
      results = await RunSQL(sqlStr)
      if (results.length) return res.errSend("手机号已存在！", 10005)
    }

    // 添加管理员
    sqlStr = adminStatement.insert({
      ...data,
      state: 0,
      password: bcrypt.hashSync(data.password, 10),
    })
    results = await RunSQL(sqlStr)
    if (results.affectedRows !== 1) return res.successSend("添加管理员失败！", 10005)

    return res.successSend("添加管理员成功！")
  } catch (error) {
    res.errSend(error)
  }
}

exports.getInfoAdmin = async (req, res) => {
  try {
    // 获取管理员信息
    const sqlStr = adminStatement.idSelect(req.params.id)
    let results = await RunSQL(sqlStr)
    if (results.length !== 1) return res.successSend("获取管理员信息失败！", 10005)
    return res.successSend("", 10000, results[0])
  } catch (error) {
    res.errSend(error)
  }
}

exports.updateAdmin = async (req, res) => {
  const data = req.body
  try {
    // 判断手机号是否存在
    if (data.phone) {
      sqlStr = adminStatement.selectPhone(data.phone)
      results = await RunSQL(sqlStr)
      if (results[0]?.id && results[0]?.id !== data.id)
        return res.errSend("手机号已存在！", 10005)
    }

    // 修改管理员信息
    sqlStr = adminStatement.idUpdate(data, data.id)
    results = await RunSQL(sqlStr)
    if (results.affectedRows !== 1)
      return res.successSend("修改管理员信息失败！", 10005)

    return res.successSend("修改管理员信息成功！")
  } catch (err) {
    return res.errSend(err)
  }
}

exports.lockAdmin = async (req, res) => {
  try {
    // 锁定/解锁管理员账号
    const data = req.body
    if (req.auth.id !== data.id) {
      const sqlStr = adminStatement.idUpdate({ state: data.idLock ? 0 : 1 }, data.id)
      let results = await RunSQL(sqlStr)
      if (results.affectedRows !== 1) return res.successSend("锁定/解锁管理员失败！", 10005)
      return res.successSend("锁定/解锁管理员成功！")
    } else res.errSend('不可以锁定/解锁自己！')
  } catch (error) {
    res.errSend(error)
  }
}

exports.deleteAdmin = async (req, res) => {
  const data = req.params.id
  try {
    // 删除管理员
    if (data !== req.auth.id) {
      // 获取管理员信息
      let sqlStr = adminStatement.idSelect(data)
      let results = await RunSQL(sqlStr)
      if (results.length !== 1) return res.successSend("获取管理员信息失败！", 10005)

      if (results[0].permission === 1) {
        // 获取高级管理员数量
        sqlStr = adminStatement.selectCount({ permission: 1 })
        results = await RunSQL(sqlStr)
        if (results.length === 1) return res.successSend("删除管理员失败!无法删除最后一个高级管理员", 10005)
      }

      sqlStr = adminStatement.delete(data)
      results = await RunSQL(sqlStr)
      if (results.affectedRows !== 1) return res.successSend("删除管理员失败！", 10005)
      return res.successSend("删除管理员成功！")
    } else res.errSend('不可以删除自己！')
  } catch (error) {
    res.errSend(error)
  }
}
